/**
 * Created by Toma on 2016/7/29.
 * ES5 数组操作
 */

"use strict";


/**
 * forEach 会默认传递参数 [].forEach(function(value, index, array) {})
 * [1, 2 ,3, 4].forEach(cost);
 * function cost(d,i,ar) { console.log(d,i,ar); }
 *
 * 更具体的例子
 * array.forEach(callback,[ thisObject])
 */
var database = {
  users: ["张含韵", "江一燕", "李小璐"],
  sendEmail: function (user) {
    if (this.isValidUser(user)) {
      console.log("你好，" + user);
    } else {
      console.log("抱歉，" + user + "，你不是本家人");
    }
  },
  isValidUser: function (user) {
    return /^张/.test(user);
  }
};
// 给每个人法邮件
database.users.forEach(    // database.users中人遍历
    database.sendEmail,    // 发送邮件
    database               // 使用database代替上面标红的this
);


/**
 * map 映射方法 与 forEach相同结构 array.map(callback,[ thisObject]);
 * 回调需要返回值 获得一个数组
 */
var users = [
  {name: "张含韵", "email": "zhang@email.com"},
  {name: "江一燕", "email": "jiang@email.com"},
  {name: "李小璐", "email": "li@email.com"}
];
var emails = users.map(user => user.email);
console.log(emails);


/**
 * filter 过滤 array.filter(callback,[ thisObject]);
 * 函数需要返回布尔值true或false 获得数组
 */
var arrayFilter = users.filter(function (item) {
  return /^张/.test(item.name);
});
arrayFilter.forEach(i => console.log(i.name));


/**
 * some 指是否“某些项”合乎条件 array.some(callback,[ thisObject]);
 * every 需要每项都合乎条件
 * 返回布尔值
 */
console.log(users.some(i => /^张/.test(i.name)));
console.log(users.every(i => /^张/.test(i.name)));


/**
 * indexOf  lastIndexOf
 * array.indexOf(searchElement[, fromIndex])
 */


/**
 * reduce 简约 | 迭代 array.reduce(callback[, initialValue])
 * array.reduce(function (previous, current, index, array) {}); callback函数接受4个参数：之前值、当前值、索引值以及数组本身
 * initialValue参数可选，表示初始值。若指定，则当作最初使用的previous值；如果缺省，则使用数组的第一个元素作为previous初始值，
 * 同时current往后排一位，相比有initialValue值少一次迭代。
 *
 * reduceRight 与 reduce 相反 从数组最后往前算
 */
var matrix = [
  [1, 2],
  [3, 4],
  [5, 6]
];
// 二维数组扁平化
var flatten = matrix.reduce(function (previous, current) {
  return previous.concat(current);
});
console.log(flatten);


/**
 * 用上面的方法举个例子 遍历所有div的class
 * document.querySelectorAll() 返回的并不是我们想当然的数组，而是 NodeList 它里面没有 .forEach 方法
 * 简写 [].forEach.call()
 * @type {NodeList}
 */
var eleDivs = document.getElementsByTagName("div");
Array.prototype.forEach.call(eleDivs, div => console.log("该div类名是：" + (div.className || "空")));
